<?php namespace app\system\controller;

use app\admin\controller\Common;
use houdunwang\db\Db;
use houdunwang\dir\Dir;
use houdunwang\request\Request;
use houdunwang\route\Controller;
use houdunwang\validate\Validate;

use system\model\Module as ModuleModel;

class Module extends Common{

	public function __construct ()
	{
		$this->auth();
		//分配已经安装的模块数据
		$this->assignModuleData();
	}

	public function assignModuleData()
	{
		$moduleData = Db::table('module')->where('module_is_system',0)->get();
		//p($moduleData);
		//在module表中潮查询module_is_system=0
		\houdunwang\view\View::with('moduleData',$moduleData);

	}
    //动作
	public function index ( ModuleModel $module )
	{
		//2.取数据扫描，那些模块是已经安装过了
		//在模板页面区别对待
		//pluck获取单一字段，获取出来的结果是一个字符串
		//lists获取单一一列字段值
		$isInstalledModule = $module->where( 'module_is_system' , 0 )->lists( 'module_name' );
		//p($isInstalledModule);
		//1.先扫描addons/，看有多少模块
		$modules = Dir::tree( 'addons' );
		//4.声明空数组
		$data = [];
		//3.处理是否已经安装、页面要循环的模块数据
		foreach ( $modules as $k => $v ) {
			//判断，如果模块中没有manifest.php文件，视为不合法模块
			$manifestFile = 'addons/' . $v[ 'basename' ] . '/manifest.php';
			if ( is_file( $manifestFile ) ) {
				$config = include $manifestFile;
				$config[ 'isinstall' ] = in_array( $v[ 'basename' ] , $isInstalledModule );
				$data[] = $config;
			}
		}
		//此处书写代码...
		//$data = $module->where('module_is_system',0)->paginate(20);

		return view( '' , compact( 'data' ) );
	}
    //设计模块
	public function design(ModuleModel $module)
	{
		if(IS_POST)
		{
			//1.接受post数据
			$post = Request::post();
			//p($post);die;
			Validate::make([
				['module_title','required','请输入模块中文名称',Validate::MUST_VALIDATE],
			]);
			//2.判断不能重复创建模块
			//考虑规范，采用目录全部小写
			$post['module_name'] = strtolower($post['module_name']);
			//在addons或者module检测，创建的模块已存在，则不允许重复创建【目录已经存在，代表是模块已经存在】
			if(is_dir("addons/{$post['module_name']}") || is_dir("module/{$post['module_name']}")){
				return ['valid'=>0,'message'=>'模块已存在，不能重复创建'];
			}
			//3.创建出模块的基本目录结构
			$dirs = [
				'controller','model','system','template',
			];
			foreach ($dirs as $dir) {
				//Dir::create（）在hdphp手册中组件--目录操作
				Dir::create("addons/{$post['module_name']}/{$dir}");
			}
			//4.生成文件
			$module_name = $post['module_name'];
			$content = <<<str
<?php namespace addons\\{$module_name}\system;

use module\Hdprocessor;

/**
 * 微信处理器
 * Class Processor
 * @package addons\\{$module_name}\system
 */
class Processor extends Hdprocessor
{
	public function handler()
	{

	}
}
str;
			file_put_contents("addons/{$post['module_name']}/system/Processor.php",$content);
			//5.数据存储到数据库
            //$module->save($post);
			//写安装和卸载模块时设计模块的时候不需要写入数据库，只生成addons/目录就好
			file_put_contents( 'addons/' . $module_name . '/manifest.php' , "<?php\r\nreturn " . var_export( $post , true ) . ";\r\n?>" );
			return ['valid'=>1,'message'=>'模块设计成功'];
		}
		return view();
	}
	//安装模块
	public function install(ModuleModel $module )
	{
		$module_name = Request::get('module_name');
		$data = include 'addons/' . $module_name . '/manifest.php';
		$module->save($data);
		return $this->setRedirect('index')->success('操作成功');
	}
	//模块卸载
	public function uninstall ()
	{
		//接受要删除模块module_name[英文标识]
		$module_name = Request::get( 'module_name' );
		//p($module_name);//pic
		//1.把该模块对应的目录删除

		//2.删除数据库对应数据
		ModuleModel::where( 'module_name' , $module_name )->delete();

		//3.成功提示
		return $this->setRedirect( 'index' )->success( '操作成功' );
	}
}
